﻿/*
 
 data   : 23/09/2011
 author : alejandro (T-IT Brasil)

 */
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using System.Linq;
using System.Collections.Generic;
using System.Net;
using System.IO;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace Presentation.ABDI.WebPart.VWPPostEvento
{
    public partial class VWPPostEventoUserControl : UserControl
    {
        private SPWeb myWeb = SPContext.Current.Web;
        private String nomeListaCertificado = Data.BioTecnologia.Properties.SharePointString.ListaCertificadosEmitidos; // "Certificados Emitidos";
        private String nomeListaInscritos = Data.BioTecnologia.Properties.SharePointString.ListaInscritos; // "Inscritos";
        private PrivateFontCollection privateFontCollection;

        protected void Page_Load(object sender, EventArgs e)
        {
            getFontCollection();
            if (Page.IsPostBack)
            {
                Boolean isBrasil = ddlNacionalidade.SelectedValue.ToString().Equals("Brasil");

                if (String.IsNullOrEmpty(txtCpf.Text) && isBrasil)
                    Response.Write("<script>alert('Campo CPF não preenchido!')</script>");
                else if (String.IsNullOrEmpty(txtPassaporte.Text) && !isBrasil)
                    Response.Write("<script>alert('Campo CPF não preenchido!')</script>");
                else
                {
                    try
                    {
                        getCertificadoInteressado(isBrasil);
                    }
                    catch (Exception ex)
                    {
                        Response.Write(string.Format("<script>alert('{0}')</script>", ex.Message));
                    }
                }
                /*  ---------------->> Comentario TESTE << */
            }

        }

        private void getCertificadoInteressado(Boolean isBrasil)
        {
            string tipoDoc = string.Empty;
            string cpf = string.Empty;
            SPList myLista = myWeb.Lists[nomeListaInscritos];

            if (isBrasil)
            {
                tipoDoc = "CPF";
                cpf = txtCpf.Text.Trim().ToUpper();
            }
            else
            {
                tipoDoc = "Passaporte";
                cpf = txtPassaporte.Text.Trim().ToUpper();
            }

            //todo: PREGUNTAR A DANIEL O TEMA DE LINQ...
            var myItemCertificado = myLista.Items.Cast<SPListItem>().Where(i => i[string.Format("{0}", tipoDoc)].Equals(cpf)).ToList();
            if (myItemCertificado.Count > 0)
            {
                if (myItemCertificado[0]["certificado"].Equals(true))
                {
                    emitirCertificado(myItemCertificado[0]["nome"].ToString(), myItemCertificado[0][string.Format("{0}", tipoDoc)].ToString(), isBrasil);
                    if (tipoDoc.Equals("CPF")) txtCpf.Text = string.Empty;
                    else txtPassaporte.Text = string.Empty;
                }
                else
                    Response.Write("<script>alert('Certificado não pode ser emitido. Favor entrar em contato pelo email enconit@abdi.com.br!')</script>");
            }
            else
            {
                Response.Write("<script>alert('Não existe certificado para o CPF/Passaporte preenchido!')</script>");
            }
        }

        /// <summary>
        /// Seta o tipo de fonte que será utilizado para disenhar o nome, data e local no certificado.
        /// </summary>
        private void getFontCollection()
        {
            if (Application["PrivateFontCollection"] == null)
            {
                Application.Lock();
                privateFontCollection = new PrivateFontCollection();
                privateFontCollection.AddFontFile(@"c:\temp\FREESCPT.TTF");
                Application["PrivateFontCollection"] = privateFontCollection;
                Application.UnLock();
            }
            else
            {
                privateFontCollection = (PrivateFontCollection)Application["PrivateFontCollection"];
            }
        }

        /// <summary>
        /// Atualiza a lista de PostEvento com os dados do usuario que solicito a certificação.
        /// </summary>
        /// <param name="nome">Nome do interessado</param>
        /// <param name="cpf">Cpf do interessado</param>
        private void emitirCertificado(string nome, string cpf, bool isBrasil)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPList myListaCertificado = myWeb.Lists[nomeListaCertificado];
                SPListItem myItem = myListaCertificado.Items.Add();

                myItem["nome"] = nome;
                myItem["cpf"] = isBrasil ? cpf : " ";
                myItem["passaporte"] = isBrasil ? " " : cpf;
                myItem["dataSolicitacao"] = DateTime.Now;

                myItem.Update();

                gerarCertificadoSolicitado(nome.ToUpper().Trim());
            });

        }

        /// <summary>
        /// Gera a imagem com o nome do interessado da certificação.
        /// </summary>
        /// <remarks>Este método tem referença do site http://econit.abdi.com.br</remarks>
        /// <param name="nome">será impresso na certificação.</param>
        /// <exception cref="System.Exception">Lança uma exceção quando não pode criar a certificação.</exception>
        private void gerarCertificadoSolicitado(string nome)
        {
            try
            {
                string modeloCertificado = String.Format("{0}/{1}", myWeb.Url, "Style Library/Certificado/modelo.jpg");
                //SPIssueList certificados = (SPIssueList)myWeb.Lists[nomeListaCertificado];

                WebClient client = new WebClient();
                client.Credentials = CredentialCache.DefaultCredentials;
                byte[] content = client.DownloadData(modeloCertificado);

                MemoryStream msModelo = new MemoryStream(content);
                Bitmap img = (Bitmap)System.Drawing.Image.FromStream(msModelo);

                Graphics g = Graphics.FromImage(img);

                StringFormat strFormat = new StringFormat();
                strFormat.Alignment = StringAlignment.Center;

                g.DrawString(nome, new System.Drawing.Font(privateFontCollection.Families[0], 16), Brushes.Black, new System.Drawing.RectangleF(500, 680, 1700, 90), strFormat);
                g.DrawString(DateTime.Now.ToString(), new System.Drawing.Font(privateFontCollection.Families[0], 16), Brushes.Black, new System.Drawing.RectangleF(500, 740, 1700, 20), strFormat);
                //g.DrawString("Brasília", new System.Drawing.Font(privateFontCollection.Families[0], 16), Brushes.Black, new System.Drawing.RectangleF(700, 740, 1700, 20), strFormat);

                MemoryStream msNovoModelo = new MemoryStream();
                img.Save(msNovoModelo, System.Drawing.Imaging.ImageFormat.Jpeg);
                content = msNovoModelo.ToArray();

                iTextSharp.text.Image watermark = iTextSharp.text.Image.GetInstance(content);

                watermark.SetAbsolutePosition(0, 0);

                Document documento = new Document(new iTextSharp.text.Rectangle(2337, 1669));
                MemoryStream ms = new MemoryStream();
                PdfWriter writer = PdfWriter.GetInstance(documento, ms);

                iTextSharp.text.Rectangle page = documento.PageSize;

                PdfPTable head = new PdfPTable(1);
                head.TotalWidth = 1750;

                documento.Open();

                head.WriteSelectedRows(0, -1, 486, 960, writer.DirectContent);

                documento.Add(watermark);
                documento.Close();

                myWeb.AllowUnsafeUpdates = true;

                byte[] byteArray = ms.ToArray();
                ms.Flush();
                ms.Close();
                Response.Clear();
                Response.AddHeader("Content-Disposition", "attachment; filename=certificado.pdf");
                Response.AddHeader("Content-Length", byteArray.Length.ToString());
                Response.ContentType = "application/octet-stream";
                Response.BinaryWrite(byteArray);
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível criar a certificação. Contato com o administrador do sistema!");
            }

        }
    }
}
